// Builds a graph with errors, displays it and saves it as
// 构建一个带误差的图表，显示并保存为图像。
// First, include some header files (not necessary for Cling)
// 首先包含一些头文件（在Cling中不必要）

#include "TCanvas.h"           // 用于绘制画布
#include "TROOT.h"             // ROOT系统的核心
#include "TGraphErrors.h"       // 用于带误差的图表
#include "TF1.h"               // 用于定义函数
#include "TLegend.h"           // 用于图例
#include "TArrow.h"            // 用于箭头图形
#include "TLatex.h"            // 用于添加Latex文本

void macro1(){
    // The values and the errors on the Y axis
    // Y轴上的数据和误差
    const int n_points=10;      // 数据点数量为10
    double x_vals[n_points]=    // X轴的值
            {1,2,3,4,5,6,7,8,9,10};
    double y_vals[n_points]=    // Y轴的值
            {6,12,14,20,22,24,35,45,44,53};
    double y_errs[n_points]=    // Y轴的误差
            {5,5,4.7,4.5,4.2,5.1,2.9,4.1,4.8,5.43};

    // Instance of the graph
    // 创建图表实例
    TGraphErrors graph(n_points,x_vals,y_vals,nullptr,y_errs);
    graph.SetTitle("Measurement XYZ;length [cm];Arb.Units");
    // 设置图表标题：Measurement XYZ，X轴为length [cm]，Y轴为Arb.Units

    // Make the plot esthetically better
    // 美化图表
    graph.SetMarkerStyle(kOpenCircle);   // 设置点的样式为空心圆
    graph.SetMarkerColor(kBlue);         // 设置点的颜色为蓝色
    graph.SetLineColor(kBlue);           // 设置线条颜色为蓝色

    // The canvas on which we'll draw the graph
    // 创建绘图的画布
    auto  mycanvas = new TCanvas();

    // Draw the graph !
    // 绘制图表
    graph.DrawClone("APE");

    // Define a linear function
    // 定义一个线性函数
    TF1 f("Linear law","[0]+x*[1]",.5,10.5); 
    // 线性函数格式：[0]+x*[1]，X轴范围为0.5到10.5

    // Let's make the function line nicer
    // 美化线条
    f.SetLineColor(kRed);       // 设置线条颜色为红色
    f.SetLineStyle(2);          // 设置线条样式为虚线

    // Fit it to the graph and draw it
    // 拟合函数到图表并绘制
    graph.Fit(&f);              // 将线性函数拟合到图表数据
    f.DrawClone("Same");        // 在同一画布上绘制函数

    // Build and Draw a legend
    // 创建并绘制图例
    TLegend leg(.1,.7,.3,.9,"Lab. Lesson 1");   // 图例的位置和标题
    leg.SetFillColor(0);        // 设置图例的背景颜色为透明
    graph.SetFillColor(0);      // 设置图表背景颜色为透明
    leg.AddEntry(&graph,"Exp. Points");    // 添加实验数据点的图例
    leg.AddEntry(&f,"Th. Law");            // 添加理论拟合函数的图例
    leg.DrawClone("Same");      // 在同一画布上绘制图例

    // Draw an arrow on the canvas
    // 在画布上绘制一个箭头
    TArrow arrow(8,8,6.2,23,0.02,"|>");    // 定义箭头起点、终点及样式
    arrow.SetLineWidth(2);      // 设置箭头线条的宽度
    arrow.DrawClone();          // 绘制箭头

    // Add some text to the plot
    // 在图表上添加一些文本
    TLatex text(8.2,7.5,"#splitline{Maximum}{Deviation}");  // 添加Latex格式的文本
    text.DrawClone();           // 绘制文本

    // Save the canvas as a PDF file
    // 将画布保存为PDF文件
    mycanvas->Print("graph_with_law.pdf");
}

int main(){
    // 执行宏函数
    macro1();
}